home *** CD-ROM | disk | FTP | other *** search
/ Personal Computer World 2009 February / PCWFEB09.iso / Software / Resources / Chat & Communication / Digsby build 37 / digsby_setup.exe / lib / encodings / punycode.pyo (.txt) < prev    next >
Python Compiled Bytecode  |  2008-10-13  |  7KB  |  253 lines

  1. # Source Generated with Decompyle++
  2. # File: in.pyo (Python 2.5)
  3.  
  4. import codecs
  5.  
  6. def segregate(str):
  7.     base = []
  8.     extended = { }
  9.     for c in str:
  10.         if ord(c) < 128:
  11.             base.append(c)
  12.             continue
  13.         extended[c] = 1
  14.     
  15.     extended = extended.keys()
  16.     extended.sort()
  17.     return (''.join(base).encode('ascii'), extended)
  18.  
  19.  
  20. def selective_len(str, max):
  21.     res = 0
  22.     for c in str:
  23.         if ord(c) < max:
  24.             res += 1
  25.             continue
  26.     
  27.     return res
  28.  
  29.  
  30. def selective_find(str, char, index, pos):
  31.     l = len(str)
  32.     while None:
  33.         pos += 1
  34.         if pos == l:
  35.             return (-1, -1)
  36.         
  37.         c = str[pos]
  38.         if c == char:
  39.             return (index + 1, pos)
  40.             continue
  41.         if c < char:
  42.             index += 1
  43.             continue
  44.         continue
  45.         return None
  46.  
  47.  
  48. def insertion_unsort(str, extended):
  49.     oldchar = 128
  50.     result = []
  51.     oldindex = -1
  52.     for c in extended:
  53.         index = pos = -1
  54.         char = ord(c)
  55.         curlen = selective_len(str, char)
  56.         delta = (curlen + 1) * (char - oldchar)
  57.         while None:
  58.             (index, pos) = selective_find(str, c, index, pos)
  59.             if index == -1:
  60.                 break
  61.             
  62.             delta += index - oldindex
  63.             oldindex = index
  64.             delta = 0
  65.             continue
  66.             oldchar = char
  67.     return result
  68.  
  69.  
  70. def T(j, bias):
  71.     res = 36 * (j + 1) - bias
  72.     if res < 1:
  73.         return 1
  74.     
  75.     if res > 26:
  76.         return 26
  77.     
  78.     return res
  79.  
  80. digits = 'abcdefghijklmnopqrstuvwxyz0123456789'
  81.  
  82. def generate_generalized_integer(N, bias):
  83.     result = []
  84.     j = 0
  85.     while None:
  86.         t = T(j, bias)
  87.         if N < t:
  88.             result.append(digits[N])
  89.             return result
  90.         
  91.         N = (N - t) // (36 - t)
  92.         j += 1
  93.         continue
  94.         return None
  95.  
  96.  
  97. def adapt(delta, first, numchars):
  98.     if first:
  99.         delta //= 700
  100.     else:
  101.         delta //= 2
  102.     delta += delta // numchars
  103.     divisions = 0
  104.     while delta > 455:
  105.         delta = delta // 35
  106.         divisions += 36
  107.     bias = divisions + 36 * delta // (delta + 38)
  108.     return bias
  109.  
  110.  
  111. def generate_integers(baselen, deltas):
  112.     result = []
  113.     bias = 72
  114.     for points, delta in enumerate(deltas):
  115.         s = generate_generalized_integer(delta, bias)
  116.         result.extend(s)
  117.         bias = adapt(delta, points == 0, baselen + points + 1)
  118.     
  119.     return ''.join(result)
  120.  
  121.  
  122. def punycode_encode(text):
  123.     (base, extended) = segregate(text)
  124.     base = base.encode('ascii')
  125.     deltas = insertion_unsort(text, extended)
  126.     extended = generate_integers(len(base), deltas)
  127.     if base:
  128.         return base + '-' + extended
  129.     
  130.     return extended
  131.  
  132.  
  133. def decode_generalized_number(extended, extpos, bias, errors):
  134.     result = 0
  135.     w = 1
  136.     j = 0
  137.     while None:
  138.         
  139.         try:
  140.             char = ord(extended[extpos])
  141.         except IndexError:
  142.             if errors == 'strict':
  143.                 raise UnicodeError, 'incomplete punicode string'
  144.             
  145.             return (extpos + 1, None)
  146.  
  147.         extpos += 1
  148.         if char <= char:
  149.             pass
  150.         elif char <= 90:
  151.             digit = char - 65
  152.         elif char <= char:
  153.             pass
  154.         elif char <= 57:
  155.             digit = char - 22
  156.         elif errors == 'strict':
  157.             raise UnicodeError("Invalid extended code point '%s'" % extended[extpos])
  158.         else:
  159.             return (extpos, None)
  160.         t = T(j, bias)
  161.         result += digit * w
  162.         if digit < t:
  163.             return (extpos, result)
  164.         
  165.         w = w * (36 - t)
  166.         j += 1
  167.         continue
  168.         return None
  169.  
  170.  
  171. def insertion_sort(base, extended, errors):
  172.     char = 128
  173.     pos = -1
  174.     bias = 72
  175.     extpos = 0
  176.     while extpos < len(extended):
  177.         (newpos, delta) = decode_generalized_number(extended, extpos, bias, errors)
  178.         if delta is None:
  179.             return base
  180.         
  181.         pos += delta + 1
  182.         char += pos // (len(base) + 1)
  183.         if char > 1114111:
  184.             if errors == 'strict':
  185.                 raise UnicodeError, 'Invalid character U+%x' % char
  186.             
  187.             char = ord('?')
  188.         
  189.         pos = pos % (len(base) + 1)
  190.         base = base[:pos] + unichr(char) + base[pos:]
  191.         bias = adapt(delta, extpos == 0, len(base))
  192.         extpos = newpos
  193.     return base
  194.  
  195.  
  196. def punycode_decode(text, errors):
  197.     pos = text.rfind('-')
  198.     if pos == -1:
  199.         base = ''
  200.         extended = text
  201.     else:
  202.         base = text[:pos]
  203.         extended = text[pos + 1:]
  204.     base = unicode(base, 'ascii', errors)
  205.     extended = extended.upper()
  206.     return insertion_sort(base, extended, errors)
  207.  
  208.  
  209. class Codec(codecs.Codec):
  210.     
  211.     def encode(self, input, errors = 'strict'):
  212.         res = punycode_encode(input)
  213.         return (res, len(input))
  214.  
  215.     
  216.     def decode(self, input, errors = 'strict'):
  217.         if errors not in ('strict', 'replace', 'ignore'):
  218.             raise UnicodeError, 'Unsupported error handling ' + errors
  219.         
  220.         res = punycode_decode(input, errors)
  221.         return (res, len(input))
  222.  
  223.  
  224.  
  225. class IncrementalEncoder(codecs.IncrementalEncoder):
  226.     
  227.     def encode(self, input, final = False):
  228.         return punycode_encode(input)
  229.  
  230.  
  231.  
  232. class IncrementalDecoder(codecs.IncrementalDecoder):
  233.     
  234.     def decode(self, input, final = False):
  235.         if self.errors not in ('strict', 'replace', 'ignore'):
  236.             raise UnicodeError, 'Unsupported error handling ' + self.errors
  237.         
  238.         return punycode_decode(input, self.errors)
  239.  
  240.  
  241.  
  242. class StreamWriter(Codec, codecs.StreamWriter):
  243.     pass
  244.  
  245.  
  246. class StreamReader(Codec, codecs.StreamReader):
  247.     pass
  248.  
  249.  
  250. def getregentry():
  251.     return codecs.CodecInfo(name = 'punycode', encode = Codec().encode, decode = Codec().decode, incrementalencoder = IncrementalEncoder, incrementaldecoder = IncrementalDecoder, streamwriter = StreamWriter, streamreader = StreamReader)
  252.  
  253.